package com.itheima.controller;

import com.itheima.annotation.OperationLog;
import com.itheima.domain.Result;
import com.itheima.domain.pojo.Dept;
import com.itheima.service.DeptService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/depts")
public class DeptController {

    @Autowired
    private DeptService deptService;

    /**
     * 查询所有部门
     * @return
     */
    // @RequestMapping(value = "/depts",method = RequestMethod.GET) // method:指定请求方式
    @GetMapping
    public Result list(){
        // 调用service层查询所有部门
        List<Dept> deptList = deptService.list();
        // 响应数据给前端
        return Result.success(deptList);
    }

    /**
     * 删除部门
     * @return
     */
    // 方式一:采用传统方式接受参数 HttpServletRequest
   /* @DeleteMapping("/depts")
    public Result deleteById(HttpServletRequest request){
        // 1.接受参数
        String id = request.getParameter("id");
        int id1 = Integer.parseInt(id);
        System.out.println("接受参数id为:"+id1);
        // 2. 调用service层
        // 3.响应数据给前端
        return null;
    }*/

    // 方式二:通过@RequestParam注解接受参数
    // 注意事项:一旦使用@RequestParam注解,那么参数一定要传递,否则报错,如果不想传参,可以设置required属性为false
    /*@DeleteMapping("/depts")
    public Result deleteById(@RequestParam(value = "id",required = false) Integer deptId){
        // 1.接受参数
        System.out.println("接受参数id为:"+deptId);
        // 2. 调用service层
        // 3.响应数据给前端
        return null;
    }*/
    // 方式三: 保证参数名和形参名一致,会自动接收 [推荐]
    @DeleteMapping
    @OperationLog
    public Result deleteById(@RequestParam("id") Integer deptId){
        // 1.接受参数
        // System.out.println("接受参数id为:"+id);
        // log.info("接受参数id为:"+id);
        log.info("删除部门参数id为:{}",deptId);
        // 2. 调用service层
        deptService.deleteById(deptId);
        // 3.响应数据给前端
        return Result.success();
    }

    /**
     * 新增部门
     * @return
     */
    @PostMapping
    @OperationLog
    public Result save(@RequestBody Dept dept){
        // System.out.println("新增部门参数:"+dept);
        log.info("新增部门参数:{}",dept);
        // 2. 调用service层
        deptService.save(dept);
        // 3.响应数据给前端
        return Result.success();
    }

    /**
     * 根据id查询部门
     * @param id
     * @return
     */
    // 路径参数,保证路径参数名和形参名一致,可以省略@PathVariable后面的();
    @GetMapping("/{id}")
    // public Result getById(@PathVariable("id") Integer deptId){
    public Result getById(@PathVariable Integer id){
        // System.out.println("根据id查询的参数:"+id);
        log.info("根据id查询的参数:{}",id);
        // 2. 调用service层
        Dept dept = deptService.getById(id);
        // 3.响应数据给前端
        return Result.success(dept);
    }

    /**
     * 修改部门
     * @return
     */
    @PutMapping
    @OperationLog
    public Result updateById(@RequestBody Dept dept){
        // System.out.println("修改部门参数:"+dept);
        log.info("修改部门参数:{}, 当前线程:{}",dept, Thread.currentThread().getName());
        // 2. 调用service层
        deptService.updateById(dept);
        // 3.响应数据给前端
        return Result.success();
    }
}
